<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // const 定义对象；
      const obj = {
        name: "张三",
        age: 20,
      };

      // 1.覆盖式
      // obj = {
      //     name:"李四"
      // }

      // obj.name = "李四";//修改obj.name的值
      // console.log(obj);

      //让对象不可被修改：不可变对象；
      // 冻结对象  Object.freeze()，只能冻结 name age 第一层的基本数据类型
      // let obj = {
      //     name:"张三",
      //     age:20,
      //     hobby:{
      //         one:"篮球",
      //         two:"足球"
      //     }
      // }
      // // 冻结对象；这是一个函数 这个函数的作用就是将对象进行冻结 就好比咱们封装好一个对象 但是又不希望后续对这个对象进行修改 就可以使用这个函数进行冻结  Object.freeze只能冻结一层基本数据类型；果在这个对象里面还有一些复杂的数据类型将不能够被冻结，所有如果我们需要将整个对象完全冻结，他们的值不管是基本类型还是复杂类型都不能够被修改的话，就需要封装一个深冻结函数；
      // Object.freeze(obj);
      // // obj.name = "李四";
      // obj.hobby.one = "乒乓球";
      // console.log(obj);

      // 深冻结
      function deepFreeze(obj) {
        Object.freeze(obj);
        for (let key in obj) {
          if (typeof obj[key] === "object") {
            deepFreeze(obj[key]);
          }
        }
      }

      let obj = {
        name: "张三",
        age: 20,
        hobby: {
          one: "篮球",
          two: "足球",
        },
      };
      deepFreeze(obj);
      obj.hobby.one = "乒乓球";
      console.log(obj);
    </script>
  </body>
</html>
